#include <iostream>
#include <opencv2/opencv.hpp>
#include <string> // 需要包含 string 库

int main(int argc, char** argv)
{

    // 1. 定义输入路径
    const std::string input_path = "../images/sumu001.jpg"; // 原图路径

    // 2. 解析文件名（自动提取前缀和后缀）
    size_t last_slash = input_path.find_last_of("/"); // 定位最后一个斜杠
    size_t last_dot = input_path.find_last_of(".");   // 定位最后一个点号

    // 提取目录路径、文件名前缀、扩展名
    std::string dir_path = input_path.substr(0, last_slash + 1); // 目录路径 (如 "../images/")
    std::string file_prefix = input_path.substr(last_slash + 1, last_dot - last_slash - 1); // 文件名 (如 "sumu001")
    std::string file_ext = input_path.substr(last_dot);                                     // 扩展名 (如 ".jpg")

    // 3. 生成灰度图输出路径
    std::string output_path = file_prefix + "_gray" + file_ext; // 组合新路径 (如 "../images/sumu001_gray.jpg")

    // 4. 读取原图
    cv::Mat image = cv::imread(input_path);
    if (image.empty())
    {
        std::cerr << "Error: Could not open image file: " << input_path << std::endl;
        return -1;
    }
    // 获取分辨率信息
    const int width = image.cols;
    const int height = image.rows;
    const std::string resolution_info = " Resolution: " + 
                                        std::to_string(width) + "x" + 
                                        std::to_string(height);
    // 核心公式：内存大小 = 图像宽 × 高 × 通道数 × 数据类型字节数。OpenCV 快捷方法：image.total() * image.elemSize()
    size_t memory_bytes = image.total() * image.elemSize();  // 核心公式
    std::cout << "[Success] Image loaded: " << input_path << resolution_info << " ";
    std::cout << "memory_bytes: " << memory_bytes << "bytes" << std::endl;
    // 5. 转换为灰度图
    cv::Mat gray_image;
    cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);

    // 3. 在灰度图上添加文字
    const std::string text = "sumu001.jpg";             // 要添加的文字
    const int pos_x = 0;         // 文字左上角 X 坐标
    const int pos_y = 24;         // 文字左上角 Y 坐标
    const double font_scale = 1; // 字体大小缩放因子

    const cv::Scalar text_color(255); // 白色 (灰度图单通道值范围 0-255)
    const int thickness = 2;          // 文字粗细
    const int font = cv::FONT_HERSHEY_SIMPLEX; // 字体类型
    
    cv::putText(
        gray_image,                   // 目标图像
        text,                         // 文字内容
        cv::Point(pos_x, pos_y),      // 文字位置 (左上角坐标)
        font,                         // 字体类型
        font_scale,                   // 字体大小缩放因子
        text_color,                   // 文字颜色（灰度图用单通道值）
        thickness                     // 线条粗细
    );

    // 6. 保存灰度图到新路径
    bool save_result = cv::imwrite(output_path, gray_image);
    if (!save_result)
    {
        std::cerr << "Error: Failed to save gray image to: " << output_path << std::endl;
        return -1;
    }

    std::cout << "[Success] Gray image saved to: " << output_path << std::endl;
    return 0;
}